package exercise_code;

import java.util.Scanner;

/*
* 给你一个 二叉树 的根结点 root，该二叉树由恰好 3 个结点组成：根结点、左子结点和右子结点。
如果根结点值等于两个子结点值之和，返回 true ，否则返回 false 。*/

class TreeNode {
    TreeNode left;
    TreeNode right;
    int val;
    TreeNode() {}
    TreeNode(int val) { this.val = val; }
    public TreeNode(TreeNode left, TreeNode right, int val) {
        this.left = left;
        this.right = right;
        this.val = val;
    }
}

public class CheckTree {

    public static boolean checkTree(TreeNode root) {
        return root.val == root.left.val + root.right.val;
    }
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入自定义二叉树节点值:");
        System.out.print("根节点值: ");
        int rootVal = scanner.nextInt();
        System.out.print("左子节点值: ");
        int leftVal = scanner.nextInt();
        System.out.print("右子节点值: ");
        int rightVal = scanner.nextInt();
        TreeNode root = new TreeNode(rootVal);
        root.left = new TreeNode(leftVal);
        root.right = new TreeNode(rightVal);
        System.out.println(checkTree(root));
    }
}

/*设二叉树上有 n 个节点（n≥3），且每个节点都有 0 或 2 个儿子。要求判断除了叶子节点，是否每个节点的值都等于其左右儿子的节点值之和。
* 使用递归思路解决：
* 1.如果当前节点是叶子节点，直接返回true，表示无需判断叶子节点
* 2.否则，如果当前节点的值不等于其孩子节点值的和，返回false
* 3.否则，递归左右孩子，如果他们都返回true，那么当前节点返回true，否则返回false.
* 核心逻辑代码实现：*/
//class test{
//    public static boolean checkTree(TreeNode root) {
//        if (root.left == null &&root.right == null){
//            return true;
//        }
//        return root.val == root.left.val + root.right.val && checkTree(root.left) && checkTree(root.right);
//    }
//}
/**
 * 复杂度分析：
 * 时间复杂度：O(n)，其中 n 为二叉树的节点个数。每个节点都会递归恰好一次。
 * 空间复杂度：O(n)。递归需要 O(n) 的栈空间。
 */

